Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for user-defined long argument prefix #278

Closed
wants to merge 1 commit into from
Closed

Support for user-defined long argument prefix #278

wants to merge 1 commit into from

Conversation

germangh
Copy link

Some programs use prefixes other than -- to identify long arguments. Example:
packer. This adds support for parameter _long_prefix that can be used to define
the prefix for long arguments.

Some programs use prefixes other than -- to identify long arguments. Example:
packer. This adds support for parameter _long_prefix that can be used to define
the prefix for long arguments.
@amoffat
Copy link
Owner

amoffat commented Sep 29, 2015

looks good 👍 . this will go in the 1.12 release. don't worry about the failed test..doesn't look releated to you.

@amoffat amoffat added this to the release 1.2.0 milestone Oct 27, 2016
@amoffat amoffat closed this Oct 27, 2016
This was referenced Nov 27, 2016
0-wiz-0 added a commit to NetBSD/pkgsrc-wip that referenced this pull request Dec 12, 2016
*   added `_out` and `_out_bufsize` validator [#346](amoffat/sh#346)
*   bugfix for internal stdout thread running when it shouldn't [#346](amoffat/sh#346)

*   regression bugfix on timeout [#344](amoffat/sh#344)
*   regression bugfix on `_ok_code=None`

*   further improvements on cpu usage

*   regression in cpu usage [#339](amoffat/sh#339)

*   fd leak regression and fix for flawed fd leak detection test [#337](amoffat/sh#337)

*   support for `io.StringIO` in python2

*   added support for using raw file descriptors for `_in`, `_out`, and `_err`
*   removed `.close()`ing `_out` handler if FIFO detected

*   composed commands no longer propagate `_bg`
*   better support for using `sys.stdin` and `sys.stdout` for `_in` and `_out`
*   bugfix where `which()` would not stop searching at the first valid executable found in PATH
*   added `_long_prefix` for programs whose long arguments start with something other than `--` [#278](amoffat/sh#278)
*   added `_log_msg` for advanced configuration of log message [#311](amoffat/sh#311)
*   added `sh.contrib.sudo`
*   added `_arg_preprocess` for advanced command wrapping
*   alter callable `_in` arguments to signify completion with falsy chunk
*   bugfix where pipes passed into `_out` or `_err` were not flushed on process end [#252](amoffat/sh#252)
*   deprecated `with sh.args(**kwargs)` in favor of `sh2 = sh(**kwargs)`
*   made `sh.pushd` thread safe
*   added `.kill_group()` and `.signal_group()` methods for better process control [#237](amoffat/sh#237)
*   added `new_session` special keyword argument for controlling spawned process session [#266](amoffat/sh#266)
*   bugfix better handling for EINTR on system calls [#292](amoffat/sh#292)
*   bugfix where with-contexts were not threadsafe [#247](amoffat/sh#195)
*   `_uid` new special keyword param for specifying the user id of the process [#133](amoffat/sh#133)
*   bugfix where exceptions were swallowed by processes that weren't waited on [#309](amoffat/sh#309)
*   bugfix where processes that dupd their stdout/stderr to a long running child process would cause sh to hang [#310](amoffat/sh#310)
*   improved logging output [#323](amoffat/sh#323)
*   bugfix for python3+ where binary data was passed into a process's stdin [#325](amoffat/sh#325)
*   Introduced execution contexts which allow baking of common special keyword arguments into all commands [#269](amoffat/sh#269)
*   `Command` and `which` now can take an optional `paths` parameter which specifies the search paths [#226](amoffat/sh#226)
*   `_preexec_fn` option for executing a function after the child process forks but before it execs [#260](amoffat/sh#260)
*   `_fg` reintroduced, with limited functionality.  hurrah! [#92](amoffat/sh#92)
*   bugfix where a command would block if passed a fd for stdin that wasn't yet ready to read [#253](amoffat/sh#253)
*   `_long_sep` can now take `None` which splits the long form arguments into individual arguments [#258](amoffat/sh#258)
*   making `_piped` perform "direct" piping by default (linking fds together).  this fixes memory problems [#270](amoffat/sh#270)
*   bugfix where calling `next()` on an iterable process that has raised `StopIteration`, hangs [#273](amoffat/sh#273)
*   `sh.cd` called with no arguments no changes into the user's home directory, like native `cd` [#275](amoffat/sh#275)
*   `sh.glob` removed entirely.  the rationale is correctness over hand-holding. [#279](amoffat/sh#279)
*   added `_truncate_exc`, defaulting to `True`, which tells our exceptions to truncate output.
*   bugfix for exceptions whose messages contained unicode
*   `_done` callback no longer assumes you want your command put in the background.
*   `_done` callback is now called asynchronously in a separate thread.
*   `_done` callback is called regardless of exception, which is necessary in order to release held resources, for example a process pool
@Ellon
Copy link

Ellon commented Oct 26, 2017

Looks like the _long_prefix option does not work with keyword arguments without value.

For example, this calls the expected (and incorrect on purpose) command:

In [27]: sh.cat(myarg=2,_long_prefix='-')
---------------------------------------------------------------------------
ErrorReturnCode_1                         Traceback (most recent call last)
<ipython-input-27-81d4f4c42ea2> in <module>()
----> 1 sh.cat(myarg=2,_long_prefix='-')

/home/emendes/.local/lib/python3.4/site-packages/sh.py in __call__(self, *args, **kwargs)
   1425             stderr = open(str(stderr), "wb")
   1426 
-> 1427         return RunningCommand(cmd, call_args, stdin, stdout, stderr)
   1428 
   1429 

/home/emendes/.local/lib/python3.4/site-packages/sh.py in __init__(self, cmd, call_args, stdin, stdout, stderr)
    772 
    773             if should_wait:
--> 774                 self.wait()
    775 
    776 

/home/emendes/.local/lib/python3.4/site-packages/sh.py in wait(self)
    790 
    791             else:
--> 792                 self.handle_command_exit_code(exit_code)
    793 
    794                 # if an iterable command is using an instance of OProc for its stdin,

/home/emendes/.local/lib/python3.4/site-packages/sh.py in handle_command_exit_code(self, code)
    813             exc = exc_class(self.ran, self.process.stdout, self.process.stderr,
    814                     ca["truncate_exc"])
--> 815             raise exc
    816 
    817 

ErrorReturnCode_1: 

  RAN: /bin/cat -myarg=2

  STDOUT:


  STDERR:
/bin/cat: invalid option -- 'm'
Try '/bin/cat --help' for more information.

But this does not:

In [28]: sh.cat(myarg=True,_long_prefix='-')
---------------------------------------------------------------------------
ErrorReturnCode_1                         Traceback (most recent call last)
<ipython-input-28-89700f6cc61e> in <module>()
----> 1 sh.cat(myarg=True,_long_prefix='-')

/home/emendes/.local/lib/python3.4/site-packages/sh.py in __call__(self, *args, **kwargs)
   1425             stderr = open(str(stderr), "wb")
   1426 
-> 1427         return RunningCommand(cmd, call_args, stdin, stdout, stderr)
   1428 
   1429 

/home/emendes/.local/lib/python3.4/site-packages/sh.py in __init__(self, cmd, call_args, stdin, stdout, stderr)
    772 
    773             if should_wait:
--> 774                 self.wait()
    775 
    776 

/home/emendes/.local/lib/python3.4/site-packages/sh.py in wait(self)
    790 
    791             else:
--> 792                 self.handle_command_exit_code(exit_code)
    793 
    794                 # if an iterable command is using an instance of OProc for its stdin,

/home/emendes/.local/lib/python3.4/site-packages/sh.py in handle_command_exit_code(self, code)
    813             exc = exc_class(self.ran, self.process.stdout, self.process.stderr,
    814                     ca["truncate_exc"])
--> 815             raise exc
    816 
    817 

ErrorReturnCode_1: 

  RAN: /bin/cat --myarg

  STDOUT:


  STDERR:
/bin/cat: unrecognized option '--myarg'
Try '/bin/cat --help' for more information.

Is this the expected behavior?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants